﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace TargetControl
{
    public class Projection
    {
        //Tỉ lệ centimet/pixel
        private float RATE_CENTI_PIXEL;

        //Tâm của vùng vẽ theo pixel
        private Point pixelCenter;

        //Kích thước tính của vùng vẽ theo pixel
        private Size pixelSize;
        
        public Projection(float rate, Size size)
        {
            RATE_CENTI_PIXEL = rate;
            pixelSize = size;
            pixelCenter.X = pixelSize.Width / 2;
            pixelCenter.Y = pixelSize.Height / 2;
        }

        /// <summary>
        /// Chuyển đổi khoảng cách từ đơn vị pixel sang đơn vị centimet
        /// </summary>
        /// <param name="valueCenti"></param>
        /// <returns></returns>
        public float FromPixelToCentimetDistance(int valuePixel)
        {
            //Tính kích thước Target theo pixel
            return (float)valuePixel * RATE_CENTI_PIXEL;
        }

        /// <summary>
        /// Chuyển đổi khoảng cách từ đơn vị centimnet sang đơn vị pixel
        /// </summary>
        /// <param name="valuePixel"></param>
        /// <returns></returns>
        public int FromCentimetToPixelDistance(float valueCenti)
        {
            //Tính kích thước Target theo pixel
            return (int) (valueCenti / RATE_CENTI_PIXEL);
        }

        /// <summary>
        /// Chuyển đổi vị trí từ pixel sang centimet
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public PointF FromPixelToCentimet(Point p)
        {
            PointF pCenti = new PointF();
            pCenti.X = (p.X - pixelCenter.X) * RATE_CENTI_PIXEL;
            pCenti.Y = (pixelCenter.Y - p.Y) * RATE_CENTI_PIXEL;
            return pCenti;
        }

        /// <summary>
        /// Chuyển đổi vị trí từ centimet sang pixel
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public Point FromCentiToPixel(PointF p)
        {
            Point pPixel = new Point();
            pPixel.X = pixelCenter.X + (int)(p.X / RATE_CENTI_PIXEL);
            pPixel.Y = pixelCenter.Y - (int)(p.Y / RATE_CENTI_PIXEL);
            return pPixel;
        }

        /// <summary>
        /// Vẽ trục tọa độ là tâm của vùng vẽ
        /// </summary>
        /// <param name="g"></param>
        public void DrawAxis(Graphics g)
        {
            Pen pen = new Pen(Color.Red);
            //Trục ngang
            Point p1 = new Point(0,pixelCenter.Y);
            Point p2 = new Point(pixelSize.Width,pixelCenter.Y);
            g.DrawLine(pen, p1, p2);
            //Trục đứng
            Point p3 = new Point(pixelCenter.X,0);
            Point p4 = new Point(pixelCenter.X, pixelSize.Height);
            g.DrawLine(pen, p3, p4);

            pen.Dispose();

        }

    }
}
